package com.myqf.d7_日期类_druid连接池.jdbc连接池;


import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;

/**
 * 作者：黎杭
 * 日期：2020/2/18
 * 这个类是一个数据库连接池类，这里边保存了很多已经打开的连接对象（Connection）,供给需要连接对象的时候，调用
 */
public class ConnectionPool {
    // 定义一个 集合，用来装Connection的数量
    // 基于Connection在取走的时候，就要减少一个，再用完了之后，又要加进池子，那么，再频繁增加和删除的时候，我们应该使用哪个集合？
    static LinkedList<Connection> list = new LinkedList<>();
    // 初始化一些Connection对象到池子里边

    static {// 静态代码块，只运行一次
        for (int x = 0; x < 10; x++) {
            Connection connection = ConnectionUtil.getConnection();// 拿到新的Connection对象将其加入到池子里边
            list.add(connection);
        }
    }
    // 取出一个连接对象
    public static Connection getConnection() {
        if (list.size() > 0) {// 当集合里边有 连接对象的时候，才取出来
            Connection connection = list.removeFirst();// 取出集合之中的第一个元素，并且得到元素的返回值
            return connection;
        } else {// 集合里边没有连接对象，那么我们就应该马上创建一个连接对象放进集合，再从集合里边取出来
            Connection connection = ConnectionUtil.getConnection();// 拿到新的Connection对象将其加入到池子里边
            list.add(connection);
            Connection connection1 = list.removeFirst();
            return connection1;
        }
    }

    // 用完连接对象之后，需要把连接对象返回给池子，以便别的使用
    public static void backConnection(Connection connection) {// 把一个Connection对象放回池子
        // 想想，什么时候才放回池子？现在池子里边的连接对象如果超过10，就没有必要放回去，直接关闭即可
        if (list.size() >= 10) {
            try {
                connection.close();// 直接关闭多余的连接池对象
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } else {
            list.add(connection);// 否则就添加到连接池里边
        }
    }
    // 查看连接池目前有多少个连接对象
    public static int getPoolSize() {
        return list.size();
    }
}
